
using System.Text.RegularExpressions;

namespace CSharpPro._1016;

class Program
{

    private static Dictionary<string, string> _users = new Dictionary<string, string>();

    static void main(string[] args)  
    {
        ShowMainMenu();
    }

    /// <summary>
    /// 显示主菜单并处理用户选择
    /// </summary>
    private static void ShowMainMenu()
    {
        while (true)
        {
            Console.Clear();
            Console.WriteLine("===== 主菜单 =====");
            Console.WriteLine("1. 登录");
            Console.WriteLine("2. 注册");
            Console.WriteLine("3. 退出");
            Console.WriteLine("==================");
            Console.Write("请选择功能(1-3): ");

            string input = Console.ReadLine()?.Trim();

            // 处理菜单选择输入
            if (!int.TryParse(input, out int choice))
            {
                Console.WriteLine("请输入有效数字！");
                WaitForKeyPress();
                continue;
            }

            switch (choice)
            {
                case 1:
                    Login();
                    break;
                case 2:
                    Register();
                    break;
                case 3:
                    Console.WriteLine("感谢使用，再见！");
                    return;
                default:
                    Console.WriteLine("请输入1-3之间的数字！");
                    WaitForKeyPress();
                    break;
            }
        }
    }

    /// <summary>
    /// 用户注册功能
    /// </summary>
    private static void Register()
    {
        Console.Clear();
        Console.WriteLine("===== 用户注册 =====");

        // 获取并验证用户名
        string username;
        while (true)
        {
            Console.Write("请输入用户名: ");
            username = Console.ReadLine()?.Trim();

            // 检查是否为空
            if (string.IsNullOrEmpty(username))
            {
                Console.WriteLine("用户名不可为空！");
                continue;
            }

            // 检查用户名长度
            if (username.Length < 3 || username.Length > 15)
            {
                Console.WriteLine("用户名长度必须为3-15个字符！");
                continue;
            }

            // 检查用户名格式（只能包含字母、数字、下划线）
            if (!Regex.IsMatch(username, @"^[a-zA-Z0-9_]+$"))
            {
                Console.WriteLine("用户名只能包含字母、数字和下划线！");
                continue;
            }

            // 检查用户名是否已存在
            if (_users.ContainsKey(username))
            {
                Console.WriteLine("该用户名已被注册！");
                continue;
            }

            // 用户名验证通过
            break;
        }

        // 获取并验证密码
        string password;
        while (true)
        {
            Console.Write("请输入密码: ");
            password = ReadPassword(); // 密码输入不显示明文

            // 检查是否为空
            if (string.IsNullOrEmpty(password))
            {
                Console.WriteLine("密码不可为空！");
                continue;
            }

            // 检查密码长度
            if (password.Length < 6 || password.Length > 20)
            {
                Console.WriteLine("密码长度必须为6-20个字符！");
                continue;
            }

            // 检查密码是否包含至少1个大写字母、1个小写字母和1个数字
            bool hasUpper = password.Any(char.IsUpper);
            bool hasLower = password.Any(char.IsLower);
            bool hasDigit = password.Any(char.IsDigit);

            if (!hasUpper || !hasLower || !hasDigit)
            {
                Console.WriteLine("密码必须包含至少1个大写字母、1个小写字母和1个数字！");
                continue;
            }

            // 验证确认密码
            Console.Write("请确认密码: ");
            string confirmPassword = ReadPassword();

            if (password != confirmPassword)
            {
                Console.WriteLine("两次输入的密码不一致！");
                continue;
            }

            // 密码验证通过
            break;
        }

        // 注册用户
        _users.Add(username, password);
        Console.WriteLine("注册成功！");
        WaitForKeyPress();
    }

    /// <summary>
    /// 用户登录功能
    /// </summary>
    private static void Login()
    {
        Console.Clear();
        Console.WriteLine("===== 用户登录 =====");

        // 获取用户名
        Console.Write("请输入用户名: ");
        string username = Console.ReadLine()?.Trim();

        // 检查用户名是否为空
        if (string.IsNullOrEmpty(username))
        {
            Console.WriteLine("用户名不可为空！");
            WaitForKeyPress();
            return;
        }

        // 检查用户名是否存在
        if (!_users.ContainsKey(username))
        {
            Console.WriteLine("用户名不存在！");
            WaitForKeyPress();
            return;
        }

        // 获取密码
        Console.Write("请输入密码: ");
        string password = ReadPassword();

        // 检查密码是否为空
        if (string.IsNullOrEmpty(password))
        {
            Console.WriteLine("密码不可为空！");
            WaitForKeyPress();
            return;
        }

        // 验证密码
        if (_users[username] == password)
        {
            Console.WriteLine("\n登录成功！正在进入系统...");
            Console.WriteLine("===== 系统首页 =====");
            Console.WriteLine($"欢迎回来，{username}！");
            Console.WriteLine("(模拟系统首页)");
            Console.WriteLine("====================");
            Console.WriteLine("按任意键返回主菜单...");
            Console.ReadKey();
        }
        else
        {
            Console.WriteLine("密码错误！");
            WaitForKeyPress();
        }
    }

    /// <summary>
    /// 读取密码（不显示输入内容）
    /// </summary>
    private static string ReadPassword()
    {
        string password = "";
        ConsoleKeyInfo key;

        do
        {
            key = Console.ReadKey(true);

            // 处理退格键
            if (key.Key == ConsoleKey.Backspace && password.Length > 0)
            {
                password = password.Substring(0, password.Length - 1);
                Console.Write("\b \b"); // 删除屏幕上的字符
            }
            // 处理回车键
            else if (key.Key != ConsoleKey.Enter)
            {
                password += key.KeyChar;
                Console.Write("*"); // 显示星号代替输入的字符
            }
        } while (key.Key != ConsoleKey.Enter);

        Console.WriteLine(); // 换行
        return password;
    }

    /// <summary>
    /// 等待用户按键继续
    /// </summary>
    private static void WaitForKeyPress()
    {
        Console.WriteLine("按任意键继续...");
        Console.ReadKey();
    }
}